package com.hsh.txt
{
	import flash.text.engine.ElementFormat;
	import flash.text.engine.FontDescription;
	import flash.text.engine.TextElement;
	import flash.text.TextFormat;
	import flash.utils.Dictionary;
	
	/**
	 * Run de Texte avec format individuel.
	 * Un bloc stockera plusieurs runs
	 * @author Jean-Marie@home
	 */
	public class Run
	{
		private var _val:Dictionary = new Dictionary(false);
		
		public static var prop:Vector.<String> = new <String>["police", "taille", "couleur", "alpha", "gras", "ital", "couleurDeco", "souligne", "surligne", "barre", "tabs", "lien"];
		
		public function Run()
		{
			formater("Calibri", 14, 0x000000, 1.0);
			decorer(false, false, false, false);
		}
		
		public function siModif(pr:String, alt:*, callback:Function):void
		{
			if (_val[pr] != alt)
			{
				_val[pr] = alt;
				callback();
			}
		}
		
		/**
		 * Détruit toutes les variables
		 */
		public function detruire():void
		{
			for (var i:int = 0; i < prop.length; i++)
			{
				delete _val[prop[i]];
			}
			_val = null;
		}
		
		/**
		 * Définition de la décoration du texte
		 * @param	g	gras
		 * @param	i	ital
		 * @param	s	souligne
		 * @param	b	barré
		 * @param	ex	exposant
		 * @param	id	indice
		 */
		public function decorer(g:Boolean = undefined, i:Boolean = false, s:Boolean = false, b:Boolean = false, ex:Boolean = false, id:Boolean = false):void
		{
			gras = g;
			ital = i;
			souligne = s;
			barre = b;
		}
		
		/**
		 * Définition du format du texte
		 * @param	p	police
		 * @param	t	taille
		 * @param	c	couleur
		 * @param	a	alpha
		 * @param	g	gras
		 * @param	i	ital
		 * @param	s	souligne
		 * @param	b	barré
		 */
		public function formater(p:String = "Calibri", t:Number = 14, c:uint = 0x000000, a:Number = 1.0, g:Boolean = false, i:Boolean = false, s:Boolean = false, b:Boolean = false):void
		{
			police = p;
			taille = t;
			couleur = c;
			alpha = a;
			decorer( g, i, s, b);
		}
		
		/**
		 * FontDescription
		 */
		public function get descript():FontDescription
		{
			return new FontDescription(police, gras ? "bold" : "normal", ital ? "italic" : "normal");
		}
		
		public function set descript(fd:FontDescription):void
		{
			police = fd.fontName;
			gras = Boolean(fd.fontWeight != "bold");
			ital = Boolean(fd.fontPosture != "normal");
		}
		
		/**
		 * TextElement
		 */
		public function get element():TextElement
		{
			return new TextElement(texte, format);
		}
		
		/**
		 * Element Format neuf
		 */
		public function get format():ElementFormat
		{
			return new ElementFormat(descript, taille, couleur, alpha);
		}
		
		public function set format(f:ElementFormat):void
		{
			descript = f.fontDescription;
			taille = f.fontSize;
			couleur = f.color;
			alpha = f.alpha;
			couleurDeco = f.color;
		}
		
		public function get fmt():TextFormat
		{
			return new TextFormat(police, taille, couleur, gras, ital, souligne, lien);
		}
		
		public function set fmt(f:TextFormat):void
		{
			police = String(f.font);
			taille = Number(f.size);
			couleur = couleurDeco = uint(f.color);
			gras = Boolean(f.bold);
			ital = Boolean(f.italic);
			souligne = Boolean(f.underline);
			tabs = f.tabStops;
			lien = f.url;
		}
		
		/**
		 * Nom de la police de caractère
		 */
		public function get police():String
		{
			return _val["police"];
		}
		
		public function set police(value:String):void
		{
			_val["police"] = value;
		}
		
		/**
		 * Taille de la police de caractère
		 */
		public function get taille():Number
		{
			return _val["taille"];
		}
		
		public function set taille(value:Number):void
		{
			_val["taille"] = value;
		}
		
		/**
		 * Couleur de la police de caractère
		 */
		public function get couleur():uint
		{
			return _val["couleur"];
		}
		
		public function set couleur(value:uint):void
		{
			_val["couleur"] = value;
		}
		
		/**
		 * Opacité du texte (0:transparent 1:opaque)
		 */
		public function get alpha():Number
		{
			return _val["alpha"];
		}
		
		public function set alpha(value:Number):void
		{
			_val["alpha"] = value;
		}
		
		/**
		 * Mettre le texte en gras ?
		 */
		public function get gras():Boolean
		{
			return _val["gras"];
		}
		
		public function set gras(value:Boolean):void
		{
			_val["gras"] = value;
		}
		
		/**
		 * Mettre le texte en italiques
		 */
		public function get ital():Boolean
		{
			return _val["ital"];
		}
		
		public function set ital(value:Boolean):void
		{
			_val["ital"] = value;
		}
		
		/**
		 * Couleur de la décoration du texte
		 */
		public function get couleurDeco():uint
		{
			return _val["couleurDeco"];
		}
		
		public function set couleurDeco(value:uint):void
		{
			_val["couleurDeco"] = value;
		}
		
		/**
		 * Souligner le texte ?
		 */
		public function get souligne():Boolean
		{
			return _val["souligne"];
		}
		
		public function set souligne(value:Boolean):void
		{
			_val["souligne"] = value;
		}
		
		/**
		 * Surligner le texte ?
		 */
		public function get surligne():Boolean
		{
			return _val["surligne"];
		}
		
		public function set surligne(value:Boolean):void
		{
			_val["surligne"] = value;
		}
		
		/**
		 * Barrer le texte ?
		 */
		public function get barre():Boolean
		{
			return _val["barre"];
		}
		
		public function set barre(value:Boolean):void
		{
			_val["barre"] = value;
		}
		
		/**
		 * position des tabulations en pixels
		 */
		public function get tabs():Array
		{
			return _val["tabs"];
		}
		
		public function set tabs(value:Array):void
		{
			_val["tabs"] = value;
		}
		
		/**
		 * hyperlien
		 */
		public function get lien():String
		{
			return _val["lien"];
		}
		
		public function set lien(value:String):void
		{
			_val["lien"] = value;
		}
		
		/**
		 * Contenu textuel
		 */
		public function get texte():String
		{
			return _val["texte"];
		}
		
		public function set texte(value:String):void
		{
			_val["texte"] = value;
		}
	}
}